package lib;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import pojo.Author;
import pojo.Book;
import pojo.Publisher;
import pojo.Translator;

import dao.AuthorDAO;
import dao.BookDAO;
import dao.PublisherDAO;
import dao.TranslatorDAO;

public class ExtractInfoBook {
	public Book ParseString(String content, String info){
		//System.out.println(info);
		//System.out.println(info);
		Pattern p;
		Matcher m;
		//String builder or String?
		StringBuilder sb = new StringBuilder();
		sb.append(info.toLowerCase());
		//deleteUnnecessaryInfo(sb);
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 
		String publishDay = getPublishDay("(ngày xuất bản|năm xb|nxb|năm xuất bản)(\\s*\\:?\\s*)([\\d]*\\s*[\\/\\-]?\\s*[\\d]*\\s*[\\/\\-]?\\s*[\\d]+)", sb);
		if(publishDay.isEmpty()){
			Calendar cal = Calendar.getInstance();
			publishDay = dateFormat.format(cal.getTime());
		}else{
			String day;
			String month;
			String year;
			
			int temp1;
			int temp2;
			boolean isSlash = true;
			temp1 = publishDay.indexOf('-');
			temp2 = publishDay.lastIndexOf('-');
			
			if(temp1 == -1 && temp1 == temp2){
				if(publishDay.indexOf('/') == -1){
					publishDay = "01-" + "01-" + publishDay.trim();
					isSlash = false;
				}
				
			}
			if(temp1 != - 1 && temp1 == temp2){
				month = publishDay.substring(0, temp1).trim();
				if(month.length() == 1)
					month = "0" + month;
				year = publishDay.substring(temp1 + 1).trim();
				publishDay = "01-" + month + "-" + year;
				isSlash = false;
			}
			if(temp1 != temp2){
				day = publishDay.substring(0, temp1).trim();
				if(day.length() == 1)
					day = "0" + day;
				month = publishDay.substring(temp1 + 1, temp2).trim();
				if(month.length() == 1)
					month = "0" + month;
				year = publishDay.substring(temp2 + 1).trim();
				publishDay = day + "-" + month + "-" + year;
				isSlash = false;
			}
			if(isSlash){
				temp1 = publishDay.indexOf('/');
				temp2 = publishDay.lastIndexOf('/');
				if(temp1 == -1 && temp1 == temp2){
					publishDay = "01-" + "01-" + publishDay.trim();
				}
				if(temp1 != - 1 && temp1 == temp2){
					month = publishDay.substring(0, temp1).trim();
					if(month.length() == 1)
						month = "0" + month;
					year = publishDay.substring(temp1 + 1).trim();
					publishDay = "01-" + month + "-" + year;
				}
				if(temp1 != temp2){
					day = publishDay.substring(0, temp1).trim();
					if(day.length() == 1)
						day = "0" + day;
					month = publishDay.substring(temp1 + 1, temp2).trim();
					if(month.length() == 1)
						month = "0" + month;
					year = publishDay.substring(temp2 + 1).trim();
					publishDay = day + "-" + month + "-" + year;
				}
			}
		}
		
		
		
		Date convertedDate = null;
		try {
			convertedDate = dateFormat.parse(publishDay);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		List<String> arr = new ArrayList<String>();
		arr.add("\\s*(xem trích đoạn)\\s*\\:?\\s*");
		arr.add("\\s*(giảm giá|giảm|giá giảm)\\s*\\:?\\s*");
		arr.add("\\s*(tủ sách)\\s*\\:?\\s*");
		arr.add("\\s*(thể loại)\\s*\\:?\\s*");
		arr.add("\\s*(tác giả)\\s*\\:\\s*");
		arr.add("\\s*(dịch giả)\\s*\\:\\s*");
		arr.add("\\s*(nhà xuất bản|nxb|nơi xuất bản)\\s*\\:\\s*");
		arr.add("\\s*(đơn vị phát hành)\\s*\\:\\s*");
		arr.add("\\s*(số trang)\\s*\\:\\s*");
		arr.add("\\s*(hình thức bìa|loại bìa)\\s*\\:\\s*");
		arr.add("\\s*(kích thước|khổ sách)\\s*\\:\\s*");
		arr.add("\\s*(trọng lượng)\\s*\\:\\s*");
		arr.add("\\s*(số lần xem)\\s*\\:\\s*");
		arr.add("\\s*(lượt xem)\\s*\\:\\s*");
		arr.add("\\s*(giá bìa)\\s*\\:\\s*");
		arr.add("\\s*(giá bán)\\s*\\:\\s*");
		arr.add("\\s*(xếp hạng)\\s*\\:\\s*");
		arr.add("\\s*(isbn)");
		arr.add("\\s*(thanh toán bằng xu)");
		arr.add("\\s*(xu tích lũy)");
		arr.add("\\s*(nhận xét)");
		arr.add("\\s*(chưa có nhận xét nào)");
		arr.add("\\s*(đang tải dữ liệu)");
		arr.add("\\s*(hãy là người đầu tiên viết)");
		arr.add("\\s*(tiết kiệm)\\s*\\:\\s*");
		arr.add("\\s*(\\(\\s*\\d*\\s*người đánh giá\\s*\\))");
		
		//List<String> arr1 = new ArrayList<String>();
		//arr1.add("\\s*(xem trích đoạn)");
		//arr1.add("\\s*(tác giả)");
		//arr1.add("\\s*(dịch giả)");
		//arr1.add("\\s*(số trang)");
		//arr1.add("\\s*(hình thức bìa)");
		//arr1.add("\\s*(kích thước)");
		//arr1.add("\\s*(trọng lượng)");
		//arr1.add("\\s*(số lần xem)");
		//arr1.add("\\s*(giá bìa)");
		//arr1.add("\\s*(giá bán)");
		//arr1.add("\\s*(giảm giá|giảm|giá giảm)");
		//arr1.add("\\s*(xếp hạng)");
		//arr1.add("\\s*(isbn)");
		//arr1.add("\\s*(thanh toán bằng xu)");
		//arr1.add("\\s*(xu tích lũy)");
		//arr1.add("\\s*(chưa có nhận xét nào)");
		
		String name = get("()\\s*\\:?\\s*", arr, sb);
		
		//boolean isFind = false;
		String authorName = get("(tác giả)\\s*\\:\\s*", arr, sb);
		authorName = formatStr(authorName);
		Author author = AuthorDAO.checkAndInsert(authorName);
		//int authorID = -1;
		//AuthorDAO authordao = new AuthorDAO();
		//List<Author> authors = authordao.getList();
		//if(authors.isEmpty()){
		//	authorID = authordao.insert(authorName);
		//}
		//else{
		//	for(int i = 0; i < authors.size(); i++){
		//		if(java.text.Normalizer.normalize(authorName, java.text.Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+","").compareTo(java.text.Normalizer.normalize(authors.get(i).getName(), java.text.Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+","")) == 0){
		//			authorID = authors.get(i).getAuthorId();
		//			isFind = true;
		//			break;
		//		}
		//	}
		//	if(!isFind){
		//		authorID = authordao.insert(authorName);
		//	}
		//}
		
		//isFind = false;
		String translatorName = get("(dịch giả)\\s*\\:\\s*", arr, sb);
		translatorName = formatStr(translatorName);
		Translator translator = TranslatorDAO.checkAndInsert(translatorName);
		//TranslatorDAO translatordao = new TranslatorDAO();
		//List<Translator> translators = translatordao.getList();
		//if(translators.isEmpty()){
		//	translatorID = translatordao.insert(translatorName);
		//}
		//else{
		//	for(int i = 0; i < translators.size(); i++){
		//		if(java.text.Normalizer.normalize(translatorName, java.text.Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+","").trim().toLowerCase().compareTo(java.text.Normalizer.normalize(translators.get(i).getName(), java.text.Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+","").trim().toLowerCase()) == 0){
		//			translatorID = translators.get(i).getTranslatorId();
		//			isFind = true;
		//			break;
		//		}
		//	}
		//	if(!isFind){
		//		translatorID = translatordao.insert(translatorName);
		//	}
		//}
		
		//isFind = false;
		String publisherName = get("(nhà xuất bản|nxb|nơi xuất bản)\\s*\\:\\s*", arr, sb);
		publisherName = formatStr(publisherName);
		Publisher publisher = PublisherDAO.checkAndInsert(publisherName);
		//PublisherDAO publisherdao = new PublisherDAO();
		//List<Publisher> publishers = publisherdao.getList();
		//if(publishers.isEmpty()){
		//	publisherID = publisherdao.insert(publisherName);
		//}
		//else{
		//	for(int i = 0; i < publishers.size(); i++){
		//		if(java.text.Normalizer.normalize(publisherName, java.text.Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+","").trim().toLowerCase().compareTo(java.text.Normalizer.normalize(publishers.get(i).getName(), java.text.Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+","").trim().toLowerCase()) == 0){
		//			publisherID = publishers.get(i).getPublisherId();
		//			isFind = true;
		//			break;
		//		}
		//	}
		//	if(!isFind){
		//		publisherID = publisherdao.insert(publisherName);
		//	}
		//}
		
		String pageNum = get("(số trang)\\s*\\:\\s*", arr, sb);
		p = Pattern.compile("(\\d+)");
		m = p.matcher(pageNum);
		if(m.find()){
			pageNum = m.group(1);	
		}
		int convertedPageNum;
		try{
			convertedPageNum = Integer.parseInt(pageNum);
		}catch(NumberFormatException e){
			e.printStackTrace();
			convertedPageNum = 0;
		}
		
		String size = get("(kích thước|khổ sách)\\s*\\:\\s*", arr, sb);
		String width = "";
		p = Pattern.compile("([.\\d]+)(\\s*)x");
		m = p.matcher(size);
		if(m.find()){
			width = m.group(1);
		}
		String height = "";
		p = Pattern.compile("x(\\s*)([.\\d]+)");
		m = p.matcher(size);
		if(m.find()){
			height = m.group(2);
		}
		float convertedWidth;
		try{
			convertedWidth = Float.parseFloat(width);
		}catch(NumberFormatException e){
			e.printStackTrace();
			convertedWidth = 0;
		}
		float convertedHeight;
		try{
			convertedHeight = Float.parseFloat(height);
		}catch(NumberFormatException e){
			e.printStackTrace();
			convertedHeight = 0;
		}
		String weight = get("(trọng lượng)\\s*\\:\\s*", arr, sb);
		p = Pattern.compile("([.\\d]+)");
		m = p.matcher(weight);
		if(m.find()){
			weight = m.group(1);
		}
		float convertedWeight;
		try{
			convertedWeight = Float.parseFloat(weight);
		}catch(NumberFormatException e){
			e.printStackTrace();
			convertedWeight = 0;
		}
		String price = get("(giá bán)\\s*\\:\\s*", arr, sb);
		if(price.isEmpty()){
			price = get("(giá bìa)\\s*\\:\\s*", arr, sb);
		}
		//System.out.println(price);
		p = Pattern.compile("([\\,\\s\\.\\d]+)");
		m = p.matcher(price);
		if(m.find()){
			price = m.group(1).trim();
		}
		if(!price.isEmpty()){
			String temp = price;
			price = "";
			int length = temp.length();
			for(int i = 0; i < length; i++){
				if(temp.charAt(i) >= 48 && temp.charAt(i) <= 57){
					price += temp.charAt(i);
				}
			}
		}
		double convertedPrice;
		try{
			convertedPrice = Double.parseDouble(price);
		}catch(NumberFormatException e){
			e.printStackTrace();
			convertedPrice = 0.0;
		}
		BookDAO bookdao = new BookDAO();
		
		return bookdao.returnBook(name, author, translator, publisher, convertedPageNum, convertedWidth, convertedHeight, convertedWeight, convertedPrice, convertedDate, content);
	}
	/*public void deleteUnnecessaryInfo(StringBuilder sb){
		Pattern p;
		Matcher m;
		String regex = "(giảm giá|giảm|giá giảm)\\s*\\:?\\s*\\(?\\s*\\d*\\s*\\%?\\s*\\)?";
		p = Pattern.compile(regex);
		m = p.matcher(sb);
		while(m.find()){
			sb.replace(m.start(), m.start() + m.group(0).length(), "");
		}
	}*/
	public String get(String title, List<String> arr, StringBuilder sb){
		Pattern p;
		Matcher m;
		String result = "";
		List<String> candidates = new ArrayList<String>();
		for(String str : arr){	
			p = Pattern.compile(title + "(.*?)" + str);
			m = p.matcher(sb);
			//m.reset();
			if(m.find())
			{
				candidates.add(m.group(2).trim());				
			}
				
		}
		if(!candidates.isEmpty()){

			int minLength;
			if(candidates.get(0).isEmpty())
				minLength = 0;
			else{
				minLength = candidates.get(0).length();
				result = candidates.get(0);
			}
			int temp;
			int size = candidates.size();
			for(int i = 1; i < size; i++){
				if(candidates.get(i).isEmpty())
					temp = 0;
				else
					temp = candidates.get(i).length();
				if(minLength > temp){
					minLength = temp;
					result = candidates.get(i);
				}
			}
		}
		
		return result;
	}
	
	public String getPublishDay(String regex, StringBuilder sb){
		Pattern p;
		Matcher m;
		String result = "";
		p = Pattern.compile(regex, Pattern.UNICODE_CHARACTER_CLASS);
		m = p.matcher(sb);
		if(m.find()){
			result = m.group(3);
			//System.out.println(m.start());
			//result = m.group(3);
			sb.replace(m.start(), m.start() + m.group(0).length(), "");
		}
		
		
		return result.trim();
	}
	private String formatStr(String content){
		if(content.isEmpty())
			return content;
		char c;
		do{
			c = content.charAt(content.length() - 1);
			if(c == '-' || c == ' ' || c == '.'){
				if(content.length() == 1){
					content = "";
					break;
				}
				else{
					content = content.substring(0, content.length() - 1);
					continue;
				}
			}else
				break;
		}while(true);
		return content;
	}
}
